"""
函数封装步骤：
1、功能代码写出来
2、def封装
3、参数化： 变化的数据定义为形参
4、返回值： 判断函数是否有数据需要给调用的人使用
   - 数据存在环境变量里了 所以不需要返回值。

封装的函数的优化：
1、记录日志： 方便问题定位 看到执行过程 == 但凡print看结果 或者debug看结果的地方都记录日志
2、因为有些用例可能没有在用例里写断言，不需要断言，在函数做判空处理。
 - 如果没有提取表达式 读出来的就是None  不能做反序列化。

优化这个提取的函数：
1、原来只能处理 json结果的提取 使用jsonpath  == {"prodId":"$..prodId"}
2、有些接口是文本响应消息，提取这个文本 ==response.text  = {"check_code":"text"}
读取kv之后 做分支判断。分别处理json格式提取 和text格式的提取。

"""

import json
from jsonpath import jsonpath
from data.envi_data import EnviData
from loguru import logger

def extract_response(response,extract_data):
    if extract_data is None:
        logger.info("用例不需要数据提取！")
        return
    # 第二步：转化为字典-- json.loads()反序列化
    logger.info("------------开始数据提取----------------------")
    extract_data = json.loads(extract_data)
    logger.info(f"提取数据的表达式是：{extract_data}")
    # 第三步：分别取到这个提取表达式里的 key 和value ，key是字段名，value是jsonpath表达式
    for k,v in extract_data.items(): # k是access_token,  v是"$..access_token"
        # 对v做判断：如果是jsonpath的表达式：做jsonpath提取
        value = None
        if v.startswith("$"):
            value = jsonpath(response.json(),v)[0]  # 是响应结果对应的数据值 0efdce50-0e2f-4ed0-b4d1-944be5ab518a
        # 对v做判断：如果是text 获取text
        elif v=="text": # {"check_code":"text"}
            value = response.text  # 直接获取响应消息的文本内容
        setattr(EnviData,k,value)
    logger.info(f"提取并存储到环境变量后的类属性是：{EnviData.__dict__}") # 等循环结束后 查看这个类所有的属性


if __name__ == '__main__':
    response = {"access_token": "0efdce50-0e2f-4ed0-b4d1-944be5ab518a",
                "token_type": "bearer", "refresh_token": "4bfc3638-e7e4-4844-a83d-c0f8340bc146",
                "expires_in": 1295999,
                "pic": "http://mall.lemonban.com:8108/2023/09/b5a479b28d514aa59dfa55422b23a6f0.jpg",
                "userId": "46189bfd628e4a738f639017f1d9225d", "nickName": "lemon_auto", "enabled": True}
    # extract_data = '{"access_token":"$..access_token","token_type":"$..token_type"}'
    extract_data = '{"check_code":"text"}'
    extract_response(response,extract_data)